package adcon.negocio.condominio;


import adcon.negocio.banco.ContaBancaria;
import adcon.negocio.dados.Endereco;
import adcon.negocio.dados.Telefone;
import adcon.negocio.unidade.Unidade;
import adcon.persistencia.Removivel;
import br.com.caelum.stella.MessageProducer;
import br.com.caelum.stella.ResourceBundleMessageProducer;
import br.com.caelum.stella.ValidationMessage;
import br.com.caelum.stella.validation.CNPJValidator;
import br.com.caelum.stella.validation.InvalidStateException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

/**
 *
 * @author thiagocifani
 */
@Entity
@NamedQueries(value = {
    @NamedQuery(name = "CondominioPorAtivo", query = "SELECT c FROM Condominio c WHERE c.ativo = ?1 and c.removido = false ORDER BY c.razaoSocial"),
    @NamedQuery(name = "CondominioPorInativo", query = "SELECT c FROM Condominio c WHERE c.ativo = ?1 and c.removido = false ORDER BY c.razaoSocial")
    })
    public class Condominio implements Removivel,  Serializable {

    @OneToMany(cascade=CascadeType.ALL)
    private List<Telefone> telefones = new ArrayList<Telefone>();
    @OneToMany(mappedBy = "condominio")
    private List<Unidade> unidades;
    @OneToOne(cascade=CascadeType.ALL)
    private Endereco endereco = new Endereco();
    @OneToOne(cascade=CascadeType.ALL)
    private ContaBancaria contaBancaria = new ContaBancaria();
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private int codigo;
    @Column(unique=true)
    private String cnpj;
    private String razaoSocial;
    private boolean ativo;
    private boolean removido;
    private String observacoes;
    private String email;
    private String contato;
    private String zelador;
    private String site;
    private String responsavel_cheque;
    private String responsavel_cnpj;
    private String responsavel_cpf;
    private String instrumento;
   
    public Condominio( List telefones,Endereco endereco, ContaBancaria contaBancaria, String cnpj, String razaoSocial, boolean ativo, String email, String contato) {
        this.telefones = telefones;
        this.endereco = endereco;
        this.contaBancaria = contaBancaria;
        this.cnpj = cnpj;
        this.razaoSocial = razaoSocial;
        this.ativo = ativo;
        this.email = email;
        this.contato = contato;
    }

    public Condominio() {

    }

    public String getInstrumento() {
        return instrumento;
    }

    public void setInstrumento(String instrumento) {
        this.instrumento = instrumento;
    }

    public List<Unidade> getUnidades() {
        return unidades;
    }

    public void setUnidades(List<Unidade> unidades) {
        this.unidades = unidades;
    }

    public String getResponsavel_cheque() {
        return responsavel_cheque;
    }

    public void setResponsavel_cheque(String responsavel_cheque) {
        this.responsavel_cheque = responsavel_cheque;
    }

    public String getResponsavel_cnpj() {
        return responsavel_cnpj;
    }

    public void setResponsavel_cnpj(String responsavel_cnpj) {
        this.responsavel_cnpj = responsavel_cnpj;
    }

    public String getResponsavel_cpf() {
        return responsavel_cpf;
    }

    public void setResponsavel_cpf(String responsavel_cpf) {
        this.responsavel_cpf = responsavel_cpf;
    }

    public String getObservacoes() {
        return observacoes;
    }

    public void setObservacoes(String observacoes) {
        this.observacoes = observacoes;
    }

    public String getContato() {
        return contato;
    }

    public void setContato(String contato) {
        this.contato = contato;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

    public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public ContaBancaria getContaBancaria() {
        return contaBancaria;
    }

    public void setContaBancaria(ContaBancaria contaBancaria) {
        this.contaBancaria = contaBancaria;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public String getRazaoSocial() {
        return razaoSocial;
    }

    public void setRazaoSocial(String razaoSocial) {
        this.razaoSocial = razaoSocial;
    }

    public List<Telefone> getTelefones() {
        return telefones;
    }

     public void setTelefones(List<Telefone> telefones) {
        this.telefones = telefones;
    }

    public void setRemovido(boolean removido) {
        this.removido = removido;
    }


    public boolean isRemovido() {
        return removido;
    }

    public void adicionarTelefone(Telefone telefone) {
        telefones.add(telefone);

    }

    public void removerTelefone( Telefone telefone) {
        telefones.remove(telefone);
    }

    public String getSite() {
        return site;
    }

    public void setSite(String site) {
        this.site = site;
    }

    public String getZelador() {
        return zelador;
    }

    public void setZelador(String zelador) {
        this.zelador = zelador;
    }

    public boolean validaCnpj(String cnpj){
        ResourceBundle resourceBundle = ResourceBundle.getBundle("StellaValidationMessages", new Locale("pt", "BR"));
        MessageProducer messageProducer = new ResourceBundleMessageProducer(resourceBundle);
        boolean isFormatted = true;
        CNPJValidator validator = new CNPJValidator(messageProducer, isFormatted);
        try {
            validator.assertValid(cnpj);
            return true;
        } catch (InvalidStateException e) {
            for (ValidationMessage message : e.getInvalidMessages()) {
                System.out.println(message.getMessage());
            }
              return false;
        }
    }

    @Override
    public String toString() {
       return razaoSocial;
    }



}
